package com.example.ggmusic;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.IBinder;

import androidx.core.app.NotificationCompat;

import java.io.IOException;


public class MusicService extends Service {
    /**
     * 媒体播放器
     */
    private MediaPlayer mMediaPlayer;

    /* 前台服务 相关属性 */
    /**
     * 通知 ID
     */
    private static final int ONGOING_NOTIFICATION_ID = 1001;
    /**
     * 频道编号
     */
    private static final String CHANNEL_ID = "Music channel";
    /**
     * 通知管理器
     */
    NotificationManager mNotificationManager;

    /* 内部类 MusicServiceBinder */
    /**
     * 内部类，提供访问 MusicService 实例的可能
     */
    public class MusicServiceBinder extends Binder {
        /**
         * 内部类可访问其外部类的实例对象及定义的成员及方法。因此在MusicServiceBinder类中，
         * 定义了名为getService的方法，该方法返回当前MusicService类实例，从而为其他组件提
         * 供了访问MusicService实例的可能
         */
        MusicService getService() {
            return MusicService.this;
        }
    }
    /**
     * 内部类实例
     */
    private final IBinder mBinder = new MusicServiceBinder();


    /**
     * 构造方法
     */
    public MusicService() {
    }

    /**
     * 响应startService()方法的回调方法
     *
     * @param intent  由startService()方法传递过来的Intent对象，可以使用它获取其他组件传递过来的数据
     * @param flags   与特定服务请求相关的额外数据，其值是0或是 STARTFLAG REDELIVERY或STAR_FLAG_RETRY的组合
     * @param startId 唯一的整型id，表示特定的一次startService()请求，可以在stopSelf(int)中使用，指定停止特定的一次服务
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 前台服务
        String title = intent.getStringExtra(MainActivity.TITLE);
        String artist = intent.getStringExtra(MainActivity.ARTIST);
        String data = intent.getStringExtra(MainActivity.DATA_URI);
        Uri dataUri = Uri.parse(data);

        // 判断版本是否在 Android Oreo 以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "Music Channel", NotificationManager.IMPORTANCE_HIGH);
            if (mNotificationManager != null)
                mNotificationManager.createNotificationChannel(channel);
        }

        // 固定
        Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE);

        // 通知栏样式配置
        NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID);
        Notification notification = builder
                .setContentTitle(title) // 标题
                .setContentText(artist) // 正文文本
                .setSmallIcon(R.drawable.ic_launcher_foreground) // 图标
                .setContentIntent(pendingIntent).build(); // 点击通知时的延迟意图

        startForeground(ONGOING_NOTIFICATION_ID, notification);

        // 发送广播
        if (mMediaPlayer != null) {
            try {
                mMediaPlayer.reset();
                mMediaPlayer.setDataSource(getApplicationContext(), dataUri);
                mMediaPlayer.prepare();
                mMediaPlayer.start();
                // 广播发射器
                Intent musicStartIntent = new Intent(MainActivity.ACTION_MUSIC_START);
                sendBroadcast(musicStartIntent);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        return super.onStartCommand(intent, flags, startId);
    }


    /**
     * 服务被创建时执行的方法
     */
    @Override
    public void onCreate() {
        super.onCreate();
        mMediaPlayer = new MediaPlayer(); // 初始化操作
    }

    /**
     * 服务结束时执行的方法
     */
    @Override
    public void onDestroy() {
        mMediaPlayer.stop();
        mMediaPlayer.release(); // 释放操作
        mMediaPlayer = null;
        super.onDestroy();
    }

    /**
     * 定义并返回IBinder接口
     *
     * @return IBinder接口
     */
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    /* 定义公有方法并通过 IBinder 接口实现 */
    /**
     * 暂停MediaPlayer音乐播放
     */
    public void pause() {
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) mMediaPlayer.pause();
    }

    /**
     * 继续MediaPlayer音乐播放
     */
    public void play() {
        if (mMediaPlayer != null) mMediaPlayer.start();
    }

    /**
     * 获取当前播放音乐总时长
     * @return int 总时长 duration
     */
    public int getDuration() {
        int duration = 0;
        if (mMediaPlayer != null) duration = mMediaPlayer.getDuration();
        return duration;
    }

    /**
     * 获取当前音乐播放进度
     * @return int 播放进度 position
     */
    public int getCurrentPosition() {
        int position = 0;
        if (mMediaPlayer != null) position = mMediaPlayer.getCurrentPosition();
        return position;
    }

    /**
     * 获取MediaPlayer音乐播放状态
     * @return boolean 播放状态
     */
    public boolean isPlaying() {
        if (mMediaPlayer != null) return mMediaPlayer.isPlaying();
        return false;
    }
}